2 #ifndef FRAMELIB_BLOCK_H 3 #define FRAMELIB_BLOCK_H 48 typedef void (T::*Method)(
Queue *);
52 Queue() : mFirst(nullptr), mTop(nullptr), mTail(nullptr) {}
54 Queue(T *
object, Method method) : mFirst(nullptr), mTop(nullptr), mTail(nullptr)
69 if (!
object || object->FrameLib_Queueable<T>::mNext !=
nullptr)
76 mTail->FrameLib_Queueable<T>::mNext = object;
80 mTop = mTail = object;
85 assert(!mFirst &&
"Can't restart queue");
92 (
object->*method)(
this);
93 mTop =
object->FrameLib_Queueable<T>::mNext;
94 object->FrameLib_Queueable<T>::mNext =
nullptr;
97 mFirst = mTail =
nullptr;
146 Connection(T *
object,
unsigned long index) : mObject(object), mIndex(index) {}
162 Connector() : mInternal(
false) {}
164 void addOut(
Connection connection,
bool setInternal)
166 mInternal = setInternal ? true : mInternal;
167 addUniqueItem(mOut, connection);
170 void deleteOut(
Connection connection,
bool setInternal)
172 deleteUniqueItem(mOut, connection);
173 mInternal = setInternal && !mOut.size() ? false : mInternal;
176 void clearOuts(
bool setInternal)
179 mInternal = setInternal ? false : mInternal;
184 std::vector<Connection> mOut;
191 const unsigned long kOrdering = -1;
198 : mType(type), mContext(context), mAllocator(context), mProxy(proxy), mNumAudioChans(0), mSupportsOrderingConnections(false), mFeedback(false) {}
216 unsigned long getNumIns()
const {
return mInputConnections.size(); }
217 unsigned long getNumOuts()
const {
return mOutputConnections.size(); }
224 virtual void setFixedInput(
unsigned long idx,
double *input,
unsigned long size) = 0;
225 virtual const double *getFixedInput(
unsigned long idx,
unsigned long *size) = 0;
231 virtual void blockUpdate(
const double *
const *ins,
double **outs,
unsigned long blockSize) = 0;
232 virtual void reset(
double samplingRate,
unsigned long maxBlockSize) = 0;
240 virtual std::string
objectInfo(
bool verbose =
false) {
return "No object info available"; }
241 virtual std::string
inputInfo(
unsigned long idx,
bool verbose =
false) {
return "No input info available"; }
242 virtual std::string
outputInfo(
unsigned long idx,
bool verbose =
false) {
return "No output info available"; }
243 virtual std::string
audioInfo(
unsigned long idx,
bool verbose =
false) {
return "No audio channel info available"; }
245 virtual FrameType inputType(
unsigned long idx)
const = 0;
246 virtual FrameType outputType(
unsigned long idx)
const = 0;
257 return (result ==
kConnectSuccess) ? changeConnection(connection, inIdx,
true) : result;
262 changeConnection(Connection(), inIdx,
true);
270 return addOrderingConnection(connection,
true);
277 deleteOrderingConnection(connection,
true);
282 clearOrderingConnections(
true);
287 clearConnections(
true);
298 changeConnection(Connection(), inIdx,
false);
299 changeAlias(&FrameLib_Object::getInputConnector, alias, inIdx,
true);
311 clearOrderingConnections(
false);
312 changeOrderingAlias(alias,
true);
320 ConnectionResult result = alias.mObject->connectionCheck(thisConnection(outIdx),
false);
326 alias.mObject->changeAlias(&FrameLib_Object::getOutputConnector, thisConnection(outIdx), alias.mIndex,
true);
334 bool isConnected(
unsigned long inIdx)
const {
return getConnection(inIdx).mObject !=
nullptr; }
343 virtual void autoOrderingConnections() = 0;
344 virtual void clearAutoOrderingConnections() = 0;
352 for (
unsigned long i = 0; i < getNumOuts(); i++)
353 addOutputDependencies(dependencies, i);
358 addOutputDependencies<std::vector<U *>>(dependencies, outIdx);
370 for (
unsigned long i = 0; i < getNumOuts(); i++)
371 addOutputDependencies(queue, i);
376 addOutputDependencies<Queue *>(queue, outIdx);
381 void setIO(
unsigned long nIns,
unsigned long nOuts,
unsigned long nAudioChans = 0)
383 mNumAudioChans = nAudioChans;
385 mInputConnections.resize((getType() ==
kScheduler || nIns) ? nIns : 1);
386 mOutputConnections.resize(nOuts);
395 template <
class U> U *
alloc(
unsigned long N)
397 return reinterpret_cast<U *
>(mAllocator->alloc(
sizeof(U) * N));
402 mAllocator->dealloc(ptr);
412 mAllocator->releaseStorage(storage->
getName());
418 static const char *
formatInfo(
const char *verboseStr,
const char *briefStr,
bool verbose)
420 return verbose ? verboseStr : briefStr;
423 static std::string
formatInfo(
const char *str,
unsigned long idx)
425 std::string info = str;
426 std::string idxStr = numberedString(
"", idx + 1);
428 for (
size_t pos = info.find(
"#", 0); pos != std::string::npos; pos = info.find(
"#", pos + 1))
429 info.replace(pos, 1, idxStr);
434 static std::string
formatInfo(
const char *verboseStr,
const char *briefStr,
unsigned long idx,
bool verbose)
436 return formatInfo(formatInfo(verboseStr, briefStr, verbose), idx);
439 static std::string
formatInfo(
const char *str,
const char *replaceStr)
441 std::string info = str;
443 for (
size_t pos = info.find(
"#", 0); pos != std::string::npos; pos = info.find(
"#", pos + 1))
444 info.replace(pos, 1, replaceStr);
449 static std::string
formatInfo(
const char *verboseStr,
const char *briefStr,
const char *replaceStr,
bool verbose)
451 return formatInfo(formatInfo(verboseStr, briefStr, verbose), replaceStr);
456 return formatInfo(
"Parameter Update - tagged input updates parameters",
"Parameter Update", verbose);
463 std::ostringstream outStr;
475 if (std::find(list.begin(), list.end(), item) != list.end())
478 list.push_back(item);
484 auto it = std::find(list.begin(), list.end(), item);
486 if (it == list.end())
505 Connector& getInputConnector(
unsigned long idx) {
return mInputConnections[idx]; }
506 Connector& getOutputConnector(
unsigned long idx) {
return mOutputConnections[idx]; }
507 Connector& getOrderingConnector(
unsigned long idx) {
return mOrderingConnector; }
509 static bool isOutput(ConnectorMethod method) {
return method == &FrameLib_Object::getOutputConnector; }
511 Connection thisConnection(
unsigned long idx)
const {
return Connection(static_cast<T *>(const_cast<FrameLib_Object *>(
this)), idx); }
515 void addToConnector(ConnectorMethod method, Connection connection,
unsigned long idx,
bool setInternal =
false)
517 if (connection.mObject)
518 (connection.mObject->*method)(connection.mIndex).addOut(thisConnection(idx), setInternal);
521 void deleteFromConnector(ConnectorMethod method, Connection connection,
unsigned long idx,
bool setInternal =
false)
523 if (connection.mObject)
524 (connection.mObject->*method)(connection.mIndex).deleteOut(thisConnection(idx), setInternal);
529 void queueConnectorVectorDependencies(
Queue *queue,
const std::vector<Connector>& connectors)
const 531 for (
auto it = connectors.begin(); it != connectors.end(); it++)
532 for (
auto jt = it->mOut.begin(); jt != it->mOut.end(); jt++)
533 queue->add(jt->mObject);
538 virtual void connectionUpdate(
Queue *queue)
540 queueConnectorVectorDependencies(queue, mInputConnections);
542 for (
auto it = mOutputConnections.begin(); it != mOutputConnections.end(); it++)
543 queue->add(it->mIn.mObject);
548 Connection getConnection(
unsigned long inIdx,
bool resolveAliases)
const 550 Connection connection = traverseAliases(&FrameLib_Object::getInputConnector, inIdx);
551 connection = connection.mObject->mInputConnections[connection.mIndex].mIn;
552 if (resolveAliases && connection.mObject)
553 connection = connection.mObject->traverseAliases(&FrameLib_Object::getOutputConnector, connection.mIndex);
557 Connection getOrderingConnection(
unsigned long idx,
bool resolveAliases)
const 559 Connection connection = traverseOrderingAliases()->mOrderingConnections[idx];
560 if (resolveAliases && connection.mObject)
561 connection = connection.mObject->traverseAliases(&FrameLib_Object::getOutputConnector, connection.mIndex);
569 if (ordering && !supportsOrderingConnections())
572 if (connection.mObject ==
this)
575 if (connection.mObject->mContext != mContext)
578 if (detectFeedback(connection.mObject))
586 void notifySelf(
bool notify,
Queue *queue =
nullptr)
591 queue->add(dynamic_cast<T *>(const_cast<FrameLib_Object *>(
this)));
593 callConnectionUpdate();
597 void notifyConnectionsChanged(Connection connection,
Queue *queue =
nullptr)
599 if (connection.mObject)
602 queue->add(connection.mObject);
604 connection.mObject->callConnectionUpdate();
608 void notifyAliasChanged(ConnectorMethod method, Connection connection,
Queue *queue)
610 if (!connection.mObject)
613 if (method == &FrameLib_Object::getOrderingConnector)
615 FrameLib_Object *
object = connection.mObject->traverseOrderingAliases();
616 std::vector<Connection> &connections =
object->mOrderingConnections;
618 for (
auto it = connections.begin(); it != connections.end(); it++)
619 notifyConnectionsChanged(*it, queue);
623 connection = connection.mObject->traverseAliases(method, connection.mIndex);
624 notifyConnectionsChanged((connection.mObject->*method)(connection.mIndex).mIn, queue);
630 ConnectionResult changeConnection(Connection connection,
unsigned long inIdx,
bool notify,
Queue *queue =
nullptr)
632 if (mInputConnections[inIdx].mIn == connection)
635 if (mInputConnections[inIdx].mInternal || (connection.mObject && connection.mObject->mOutputConnections[connection.mIndex].mInternal))
640 std::swap(mInputConnections[inIdx].mIn, connection);
641 deleteFromConnector(&FrameLib_Object::getOutputConnector, connection, inIdx);
642 addToConnector(&FrameLib_Object::getOutputConnector, mInputConnections[inIdx].mIn, inIdx);
646 notifyConnectionsChanged(connection, queue);
647 notifyConnectionsChanged(mInputConnections[inIdx].mIn, queue);
648 notifySelf(notify, queue);
655 typedef bool ListMethod(std::vector<Connection>&, Connection);
656 typedef void (
FrameLib_Object::*AlterMethod)(ConnectorMethod, Connection,
unsigned long, bool);
658 ConnectionResult changeOrderingConnection(Connection connection, ListMethod listUpdate, AlterMethod alterConnector,
bool notify,
Queue *queue)
660 if (!supportsOrderingConnections())
663 if (mOrderingConnector.mInternal || connection.mObject->mOutputConnections[connection.mIndex].mInternal)
668 if (!listUpdate(mOrderingConnections, connection))
671 (this->*alterConnector)(&FrameLib_Object::getOutputConnector, connection, kOrdering,
false);
675 notifyConnectionsChanged(connection, queue);
676 notifySelf(notify, queue);
683 return changeOrderingConnection(connection, &addUniqueItem<Connection>, &FrameLib_Object::addToConnector, notify, queue);
686 void deleteOrderingConnection(Connection connection,
bool notify,
Queue *queue =
nullptr)
688 changeOrderingConnection(connection, &deleteUniqueItem<Connection>, &FrameLib_Object::deleteFromConnector, notify, queue);
693 void clearOrderingConnections(
bool notify,
Queue *queue =
nullptr)
695 if (!supportsOrderingConnections() || mOrderingConnector.mInternal)
698 while (mOrderingConnections.size())
702 Connection connection = mOrderingConnections.back();
703 mOrderingConnections.pop_back();
704 deleteFromConnector(&FrameLib_Object::getOutputConnector, connection, kOrdering);
708 notifyConnectionsChanged(connection, queue);
713 notifySelf(notify, queue);
718 void clearOutput(
unsigned long outIdx,
Queue *queue =
nullptr)
720 while (!mOutputConnections[outIdx].mInternal && mOutputConnections[outIdx].mOut.size())
724 Connection connection = mOutputConnections[outIdx].mOut.back();
725 mOutputConnections[outIdx].mOut.pop_back();
727 if (connection.mIndex == kOrdering)
728 connection.mObject->deleteOrderingConnection(thisConnection(outIdx),
false, queue);
730 connection.mObject->mInputConnections[connection.mIndex].mIn = Connection();
734 notifyConnectionsChanged(connection, queue);
740 void clearConnections(
bool notify)
746 for (
unsigned long i = 0; i < getNumIns(); i++)
748 changeConnection(Connection(), i,
false, &queue);
749 changeAlias(&FrameLib_Object::getInputConnector, Connection(), i,
false, &queue);
750 clearAliases(&FrameLib_Object::getInputConnector, i, &queue);
755 clearOrderingConnections(
false, &queue);
756 changeOrderingAlias(
nullptr,
false, &queue);
757 clearAliases(&FrameLib_Object::getOrderingConnector, kOrdering, &queue);
761 for (
unsigned long i = 0; i < getNumOuts(); i++)
763 clearOutput(i, &queue);
764 changeAlias(&FrameLib_Object::getOutputConnector, Connection(), i,
false, &queue);
765 clearAliases(&FrameLib_Object::getOutputConnector, i, &queue);
770 notifySelf(notify, &queue);
772 queue.start(&T::FrameLib_Object::connectionUpdate);
777 void addDependency(
Queue *queue)
const 779 queue->add(dynamic_cast<T *>(const_cast<FrameLib_Object *>(
this)));
782 template <
class U>
void addDependency(std::vector<U *>& dependencies)
const 787 addUniqueItem(dependencies,
object);
791 void traverseDependencies(U& dependencies,
const Connector& connector,
void (
FrameLib_Object::*method)(U&,
unsigned long)
const)
const 793 for (
auto it = connector.mOut.begin(); it != connector.mOut.end(); it++)
794 (it->mObject->*method)(dependencies, it->mIndex);
797 template <
class U>
void addOutputDependencies(U &dependencies,
unsigned long outIdx)
const 799 if (mOutputConnections[outIdx].mInternal)
800 traverseDependencies(dependencies, mOutputConnections[outIdx], &FrameLib_Object::addOutputDependencies<U>);
802 traverseDependencies(dependencies, mOutputConnections[outIdx], &FrameLib_Object::unwrapInputAliases<U>);
805 template <
class U>
void unwrapInputAliases(U& dependencies,
unsigned long inIdx)
const 807 if (inIdx == kOrdering && mOrderingConnector.mOut.size())
808 traverseDependencies(dependencies, mOrderingConnector, &FrameLib_Object::unwrapInputAliases<U>);
809 else if (inIdx != kOrdering && mInputConnections[inIdx].mOut.size())
810 traverseDependencies(dependencies, mInputConnections[inIdx], &FrameLib_Object::unwrapInputAliases<U>);
812 addDependency(dependencies);
817 Connection traverseAliases(ConnectorMethod method,
unsigned long idx)
const 819 const Connector& connector = (
const_cast<FrameLib_Object *
>(
this)->*method)(idx);
821 if ((!isOutput(method) && connector.mInternal) || (isOutput(method) && connector.mIn.mObject))
822 return connector.mIn.mObject->traverseAliases(method, connector.mIn.mIndex);
824 return thisConnection(idx);
827 void changeAlias(ConnectorMethod method, Connection alias,
unsigned long idx,
bool notify,
Queue *queue =
nullptr)
829 Connector& connector = (this->*method)(idx);
831 if (connector.mIn.mObject && !isOutput(method) && !connector.mInternal)
836 std::swap(connector.mIn, alias);
837 connector.mInternal = isOutput(method) ? connector.mInternal : (bool) connector.mIn.mObject;
838 deleteFromConnector(method, alias, idx, isOutput(method));
839 addToConnector(method, connector.mIn, idx, isOutput(method));
843 notifyAliasChanged(method, alias, queue);
844 notifyAliasChanged(method, connector.mIn, queue);
845 notifySelf(notify, queue);
848 void clearAliases(ConnectorMethod method,
unsigned long idx,
Queue *queue)
852 Connector& connector = (this->*method)(idx);
854 if (isOutput(method) && !connector.mInternal)
859 if (isOutput(method))
860 addOutputDependencies(queue, idx);
862 unwrapInputAliases(queue, idx);
866 for (
auto it = connector.mOut.begin(); it != connector.mOut.end(); it++)
867 (it->mObject->*method)(it->mIndex).mIn = Connection();
868 connector.clearOuts(isOutput(method));
873 FrameLib_Object *traverseOrderingAliases()
const {
return traverseAliases(&FrameLib_Object::getOrderingConnector, kOrdering).mObject; }
875 void changeOrderingAlias(T *alias,
bool notify,
Queue *queue =
nullptr)
877 changeAlias(&FrameLib_Object::getOrderingConnector, Connection(alias, kOrdering), kOrdering, notify, queue);
882 bool detectFeedback(T *
object)
884 object->mFeedback =
false;
885 Queue queue(static_cast<T*>(
this), &T::feedbackProbe);
886 return object->mFeedback;
889 void feedbackProbe(
Queue *queue)
892 queueConnectorVectorDependencies(queue, mOutputConnections);
905 unsigned long mNumAudioChans;
909 std::vector<Connector> mInputConnections;
910 std::vector<Connector> mOutputConnections;
911 std::vector<Connection> mOrderingConnections;
912 Connector mOrderingConnector;
914 bool mSupportsOrderingConnections;
943 virtual void setStream(
void *streamOwner,
unsigned long stream) {}
ObjectType
Definition: FrameLib_Types.h:53
holds the connected object and IO indices for a connection to an object
Definition: FrameLib_Object.h:143
bool isConnected(unsigned long inIdx) const
Definition: FrameLib_Object.h:334
virtual std::string objectInfo(bool verbose=false)
Definition: FrameLib_Object.h:240
void deleteConnection(unsigned long inIdx)
Definition: FrameLib_Object.h:260
virtual const FrameLib_Parameters * getParameters() const
Definition: FrameLib_Object.h:250
ConnectionResult addOrderingConnection(Connection connection)
Definition: FrameLib_Object.h:265
unsigned long mIndex
Definition: FrameLib_Object.h:152
Queue(T *object, Method method)
Definition: FrameLib_Object.h:54
unsigned long getNumOuts() const
Definition: FrameLib_Object.h:217
a set of parameters for a FrameLib object.
Definition: FrameLib_Parameters.h:30
void addOutputDependencies(std::vector< U *> &dependencies)
Definition: FrameLib_Object.h:350
FrameLib_Proxy * getProxy() const
Definition: FrameLib_Object.h:212
Connection getConnectionInternal(unsigned long inIdx) const
Definition: FrameLib_Object.h:365
virtual ~FrameLib_Block()
Definition: FrameLib_Object.h:939
a class used to represent distinct non-connectable areas in the host environment. ...
Definition: FrameLib_Context.h:21
void deleteOrderingConnection(Connection connection)
Definition: FrameLib_Object.h:275
static std::string formatInfo(const char *str, unsigned long idx)
Definition: FrameLib_Object.h:423
static bool addUniqueItem(std::vector< U > &list, U item)
Definition: FrameLib_Object.h:473
void dealloc(U *&ptr)
Definition: FrameLib_Object.h:400
Definition: FrameLib_Types.h:56
Definition: FrameLib_Types.h:56
ManagedPointer< FrameLib_LocalAllocator, &Global::getAllocator, &Global::releaseAllocator > Allocator
Definition: FrameLib_Context.h:103
FrameLib_LocalAllocator::Storage * registerStorage(const char *name)
Definition: FrameLib_Object.h:408
unsigned long getNumAudioChans() const
Definition: FrameLib_Object.h:220
a virtual struct allowing for extensible communication to/from the host environment.
Definition: FrameLib_Types.h:69
virtual std::string outputInfo(unsigned long idx, bool verbose=false)
Definition: FrameLib_Object.h:242
Queue & operator=(const Queue &)=delete
void addOutputDependencies(Queue *queue, unsigned long outIdx)
Definition: FrameLib_Object.h:374
a template class for items that can be placed on a queue
Definition: FrameLib_Object.h:29
T * getFirst() const
Definition: FrameLib_Object.h:100
ConnectionResult setOutputAlias(Connection alias, unsigned long outIdx)
Definition: FrameLib_Object.h:318
static std::string formatInfo(const char *verboseStr, const char *briefStr, const char *replaceStr, bool verbose)
Definition: FrameLib_Object.h:449
ObjectType getType() const
Definition: FrameLib_Object.h:204
Queue()
Definition: FrameLib_Object.h:52
const char * getName() const
Definition: FrameLib_Memory.h:328
an abstract template class providing an interface for FrameLib objects and implementing connectivity ...
Definition: FrameLib_Object.h:128
void clearConnections()
Definition: FrameLib_Object.h:285
static std::string parameterInputInfo(bool verbose)
Definition: FrameLib_Object.h:454
Definition: FrameLib_Types.h:56
ConnectionResult setInputAlias(Connection alias, unsigned long inIdx)
Definition: FrameLib_Object.h:292
virtual void setStream(void *streamOwner, unsigned long stream)
Definition: FrameLib_Object.h:943
ConnectionResult addConnection(Connection connection, unsigned long inIdx)
Definition: FrameLib_Object.h:254
Definition: FrameLib_Types.h:56
void clearAllocator()
Definition: FrameLib_Object.h:406
const double * getEmptyFixedInput(unsigned long idx, unsigned long *size)
Definition: FrameLib_Object.h:495
virtual std::string inputInfo(unsigned long idx, bool verbose=false)
Definition: FrameLib_Object.h:241
Connection getOrderingConnection(unsigned long idx) const
Definition: FrameLib_Object.h:339
FrameLib_Context getContext() const
Definition: FrameLib_Object.h:208
void clearOrderingConnections()
Definition: FrameLib_Object.h:280
bool supportsOrderingConnections() const
Definition: FrameLib_Object.h:337
an abstract class that represents either a single FrameLib_DSP object, or a group of connected FrameL...
Definition: FrameLib_Object.h:931
size_t blockSize(void *ptr)
Definition: FrameLib_Memory.cpp:23
Connection getOrderingConnectionInternal(unsigned long idx) const
Definition: FrameLib_Object.h:366
ConnectionResult setOrderingAlias(T *alias)
Definition: FrameLib_Object.h:305
void addOutputDependencies(std::vector< U *> &dependencies, unsigned long outIdx)
Definition: FrameLib_Object.h:356
void enableOrderingConnections()
Definition: FrameLib_Object.h:391
T * mObject
Definition: FrameLib_Object.h:151
static bool handlesAudio()
Definition: FrameLib_Object.h:236
U * alloc(unsigned long N)
Definition: FrameLib_Object.h:395
static std::string formatInfo(const char *str, const char *replaceStr)
Definition: FrameLib_Object.h:439
static bool deleteUniqueItem(std::vector< U > &list, U item)
Definition: FrameLib_Object.h:482
FrameLib_Queueable()
Definition: FrameLib_Object.h:34
FrameLib_Block(ObjectType type, FrameLib_Context context, FrameLib_Proxy *proxy)
Definition: FrameLib_Object.h:938
unsigned long getNumOrderingConnections() const
Definition: FrameLib_Object.h:338
virtual std::string audioInfo(unsigned long idx, bool verbose=false)
Definition: FrameLib_Object.h:243
void setIO(unsigned long nIns, unsigned long nOuts, unsigned long nAudioChans=0)
Definition: FrameLib_Object.h:381
virtual ~FrameLib_Object()
Definition: FrameLib_Object.h:200
void add(T *object)
Definition: FrameLib_Object.h:65
static std::string formatInfo(const char *verboseStr, const char *briefStr, unsigned long idx, bool verbose)
Definition: FrameLib_Object.h:434
void addOutputDependencies(Queue *queue)
Definition: FrameLib_Object.h:368
a single-threaded queue for non-recursive queuing of items for processing
Definition: FrameLib_Object.h:46
Connection()
Definition: FrameLib_Object.h:145
void releaseStorage(FrameLib_LocalAllocator::Storage *&storage)
Definition: FrameLib_Object.h:410
unsigned long getNumAudioOuts() const
Definition: FrameLib_Object.h:219
unsigned long getNumAudioIns() const
Definition: FrameLib_Object.h:218
Definition: FrameLib_Types.h:53
ConnectionResult
Definition: FrameLib_Types.h:56
FrameType
Definition: FrameLib_Types.h:54
static const char * formatInfo(const char *verboseStr, const char *briefStr, bool verbose)
Definition: FrameLib_Object.h:418
Connection(T *object, unsigned long index)
Definition: FrameLib_Object.h:146
named storage local to a specific context.
Definition: FrameLib_Memory.h:278
Connection getConnection(unsigned long inIdx) const
Definition: FrameLib_Object.h:335
Definition: FrameLib_Types.h:53
void start(Method method)
Definition: FrameLib_Object.h:83
typename FrameLib_Queueable< FrameLib_Multistream >::Queue Queue
Definition: FrameLib_Object.h:133
unsigned long getNumIns() const
Definition: FrameLib_Object.h:216
FrameLib_Object(ObjectType type, FrameLib_Context context, FrameLib_Proxy *proxy)
Definition: FrameLib_Object.h:197
static std::string numberedString(const char *str, unsigned long idx)
Definition: FrameLib_Object.h:461
void callConnectionUpdate()
Definition: FrameLib_Object.h:348
Definition: FrameLib_Types.h:56
Definition: FrameLib_Types.h:56